#pragma once

#include<iostream>
#include<string>
#include<cstdio>
#include<cstdarg>
#include<ctime>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

enum
{
    Debug=1,
    Info,
    Warning,
    Error,
    Fatal,
    Unkown
};

const std::string fileName="./log/tcpserver.log";

std::string toErrorString(int level)
{
    switch(level)
    {
        case Debug:
            return "Debug";
        case Info:
            return "Info";
        case Warning:
            return "Warning";
        case Error:
            return "Error";
        case Fatal:
            return "Fatal";
        default:
            return "Unkown";
    }
}

std::string getTime()
{
    time_t cur=time(nullptr);//获取现在时间
    struct tm *tmp=localtime(&cur);

    char buffer[128];
    snprintf(buffer,sizeof(buffer),"%d-%d-%d %d:%d:%d",tmp->tm_year+1900,tmp->tm_mon+1,tmp->tm_mday,tmp->tm_hour,tmp->tm_min,tmp->tm_sec);

    return buffer;
}


//日志分两部分
//第一部分是错误等级+时间+线程PID
//第二部分是报错信息
void logMessage(int level,const char*format,...)
{   
    //第一部分日志
    char rightLog[1024];
    std::string error_string=toErrorString(level);
    std::string curr_time=getTime();

    snprintf(rightLog,sizeof(rightLog),"[%s] [%s] [%d] ",error_string.c_str(),curr_time.c_str(),getpid());

    //第二部分日志
    char leftLog[1024];
    va_list p;
    va_start(p,format);//定位到可变参数的起始位置
    vsnprintf(leftLog,sizeof(leftLog),format,p);//将可变参数按照format格式写入leftLog
    
    //打印日志
    printf("%s%s\n",rightLog,leftLog);

    // //将日志信息保存到文件中
    // FILE*fp=fopen(fileName.c_str(),"a");
    // if(fp==nullptr)return;
    // fprintf(fp,"%s%s\n",rightLog,leftLog);
    // fflush(fp);
    // fclose(fp);
}